import random
from constantes import *
from pila import Pila


class Tarjeta(object):
	"""Implementacion de una tarjeta de pais."""

	def __init__(self, pais, tipo):
		"""Constructor desde pais y tipo."""
		self.pais = pais
		self.tipo = tipo

	def __str__(self):
		"""Representacion grafica."""
		return "(%s, %s)" % (self.pais, NOMBRE_TARJETAS[self.tipo])


class Mazo(object):
	"""Implementacion del mazo de tarjetas de pais."""

	def __init__(self, paises_por_tarjeta):
		"""Creacion desde un diccionario de paises segun tipo.
		Debe inicializar el mazo con todas las tarjetas mezcladas."""
		self.tarjetas = Pila()
		self.tarjetas_devueltas = []
		self.cantidad_mazo = 0

		for tipo_de_pais in paises_por_tarjeta:
			random.shuffle(paises_por_tarjeta[tipo_de_pais])
			for pais in paises_por_tarjeta[tipo_de_pais]:
				self.tarjetas.apilar(Tarjeta(pais, tipo_de_pais))
				self.cantidad_mazo += 1

	def sacar_tarjeta(self):
		"""Saca una tarjeta del mazo.
		Si el mazo se acabara, debe mezclar y empezar a repartir desde
		las tarjetas ya devueltas."""
		tarjeta = self.tarjetas.desapilar()
		self.cantidad_mazo -= 1
		if self.tarjetas.esta_vacia():
			self._mezclar_mazo()
		return tarjeta

	def devolver_tarjeta(self, tarjeta):
		"""Recibe una tarjeta y la guarda en el pilon de tarjetas
		devueltas. Cuando se acaben las tarjetas del mazo, se mezclaran
		las ya devueltas."""
		self.tarjetas_devueltas.append(tarjeta) 

	def cantidad_tarjetas(self):
		"""Devuelve la cantidad *total* de tarjetas (tanto en el mazo
		como devueltas)."""
		return self.cantidad_mazo + len(self.tarjetas_devueltas)

	def _mezclar_mazo(self):
		""""Metodo privado, cuando la pila esta vacia, mezcla toda la lista de "self.tarjetas_devueltas"
			y las apila a todas en la instancia de la clase pila "tarjeta". Tambien actualiza el atributo
			"self.cantidad_mazo" y vacia la lista "self.tarjetas_devueltas"."""
		random.shuffle(self.tarjetas_devueltas)
		for tarjeta in self.tarjetas_devueltas:
			self.tarjetas.apilar(tarjeta)

		self.cantidad_mazo = len(self.tarjetas_devueltas)
		self.tarjetas_devueltas = []